x86/microcode: Allow "ucode=" argument to be negative
authorJan Beulich <jbeulich@suse.com>
Tue, 13 Dec 2011 08:47:13 +0000 (09:47 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 13 Dec 2011 08:47:13 +0000 (09:47 +0100)
... to indicate counting from the end of the modules list.

Suggested by Tim Deegan.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
xen/arch/x86/microcode.c

index d9e6a4c58d695a6a7f0654f9079a342c07da8626..c3a8472e3bf054180467cf7ab7be7565b1cdf3cb 100644 (file)
@@ -41,7 +41,7 @@
 
 static module_t __initdata ucode_mod;
 static void *(*__initdata ucode_mod_map)(const module_t *);
-static unsigned int __initdata ucode_mod_idx;
+static signed int __initdata ucode_mod_idx;
 static bool_t __initdata ucode_mod_forced;
 static cpumask_t __initdata init_mask;
 
@@ -54,7 +54,7 @@ void __init microcode_set_module(unsigned int idx)
 static void __init parse_ucode(char *s)
 {
     if ( !ucode_mod_forced )
-        ucode_mod_idx = simple_strtoul(s, NULL, 0);
+        ucode_mod_idx = simple_strtol(s, NULL, 0);
 }
 custom_param("ucode", parse_ucode);
 
@@ -65,7 +65,9 @@ void __init microcode_grab_module(
 {
     module_t *mod = (module_t *)__va(mbi->mods_addr);
 
-    if ( !ucode_mod_idx || ucode_mod_idx >= mbi->mods_count ||
+    if ( ucode_mod_idx < 0 )
+        ucode_mod_idx += mbi->mods_count;
+    if ( ucode_mod_idx <= 0 || ucode_mod_idx >= mbi->mods_count ||
          !__test_and_clear_bit(ucode_mod_idx, module_map) )
         return;
     ucode_mod = mod[ucode_mod_idx];